package com.cskaoyan.javase.object.getclass2;

/**
 * @description: getClass()方法
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 看一个方法 首先看方法的声明:
 * public final Class<?> getClass()
 * 权限是公共的 用这个方法 不用考虑权限问题
 * final 可以被继承 但是你不能重写
 * Class<?>  该方法的返回值类型是Class类的对象 <?>表示泛型 在集合当中详细说
 * 返回此 Object 的运行时类,表示此对象运行时类的 Class 对象
 * 所以说Class实际上是一个类的运行时类
 *
 * JVM每加载一个类，都会在内存中创建唯一一个和该类对应的Class对象
 * - 这个Class对象包含了这个类的全部信息: 方法 属性 构造器等 不会装属性的具体取值
 * - 帮助程序员在运行时期，了解该对象的属性和行为
 * - Class对象处于堆上
 * - **在运行时期程序员可以通过这个类，获取该类型的所有信息**
 *
 * 现在大家虽然学了这个,但是真的要用
 * 反射就是Class类的API
 * 要等到反射 反射可以破解封装性 包括私有的成员 构造方法都可以获取
 * 反射也是触发类加载的方式 挖坑
 *
 */
public class Demo {
    public static void main(String[] args) {
        //创建学生类对象
        Student s = new Student();
        //这个时候堆上已经存在了Class对象
        Class aClazz = s.getClass();
        //System.out.println(aClazz); //这边隐含了一个toString()

        //思考: 一个类在堆上有几个Class对象? 类加载几次?
        Student s2 = new Student();
        Class aClazz2 = s2.getClass();
        System.out.println(s == s2); //== !=可以连接对象引用 比较的是对象的内存地址
        System.out.println(aClazz == aClazz2); //true\


        System.out.println(aClazz.getName()); //全限定类名
        System.out.println(aClazz.getSimpleName()); //简单类名
        System.out.println(aClazz.toString());
    }
}

class Student {
}
